Added fixture method and bugfixes | This Week in Rails
https://world.hey.com/this.week.in.rails/added-fixture-method-and-bugfixes-1e52810a
Ruby on Rails — Rails Versions 6.1.7.7, 7.0.8.1, and 7.1.3.2 have been released!
セキュリティ問題に関する修正を含むバージョンがリリースされた、というお知らせです
関連して、Railsガイドの「Ruby on Rails のメンテナンスポリシー」を読むと、セキュリティ問題の修正をどのバージョンまでサポートしているかが分かりますね
2024-03-03現在では7.1系、7.0系、6.1系が対象となっています
Expose a generic fixture accessor for fixture names that may conflict with Minitest by casperisfine · Pull Request #51213 · rails/rails · GitHub
意訳すると「Minitest と競合する可能性のあるフィクスチャ名に対して、汎用的なアクセサを実装しました」
ActiveRecordに関する変更です
ActiveRecord::FixtureSetというクラスがあります
from: Rails 7 API: ActiveRecord::FixtureSet(翻訳)|TechRacho by BPS株式会社
fixtureとは、テストの対象としたいデータ(つまりサンプルデータ)を組み立てる手法のひとつです。
fixtureはYAMLファイルに保存されます。1つのYAMLファイルが1つのモデルに対応し、ActiveSupport::TestCase.fixture_path=(パス)で指定されたディレクトリに保存されます(このディレクトリはRailsで自動設定されますので、自分のRailsアプリ/test/fixtures/に保存できます)。fixtureファイル名の末尾には.yml拡張子が付きます。
fixtureファイルのフォーマットは次のような感じになります。
code:自分のRailsアプリ/test/fixtures/web_sites.yml
rubyonrails:
id: 1
name: Ruby on Rails
url: http://www.rubyonrails.org
google:
id: 2
name: Google
url: http://www.google.com
test環境では、各テストの実行前にすべてのfixtureが自動的にデータベースに読み込まれます。データの一貫性を保つために、fixtureは読み込みが実行される前に環境によって削除されます
fixtureで登録したデータを読み出す方法は2つあります
モデル名をつかう
これは純粋にfixtureファイルのデータがテーブルに登録されているので、それを普段通り取得してるだけですね
code:rb
require "test_helper"
class WebSiteTest < ActiveSupport::TestCase
test "web_site_count" do
assert_equal 2, WebSite.count
end
end
特殊なメソッドをつかう
fixtureファイルの名前をメソッドとして呼び出すことができます
そのメソッドの引数にfixtureファイル内のkeyの名称(fixture名と呼ぶ)を指定すると、その名称と一致するデータを返してくれます
code:rb
test "find one" do
assert_equal "Ruby on Rails", web_sites(:rubyonrails).name
end
今回のプルリクエストでは、後者(つまり「特殊なメソッドをつかう」)の場合に関する変更を加えています
最近、Minitestに metadata というメソッドが追加されました
+ Add metadata lazy accessor to Runnable / Result. (matteeyah) · minitest/minitest@de80282 · GitHub
2023-07-27のコミットです
Minitestを利用していて、かつ、RailsのFixtureSetとして metadata.yml を利用している場合、metadata メソッドが競合してしまいます
その問題を避けるために、今回のプルリクエストでは明示的にFixtureSetを利用するためのメソッドとして fixture メソッドを実装しています
fixture(fixtureファイル名, fixture名) という形で利用できます
Fix #51164 Model.query_constraints with single non-primary-key column raises incorrect error by joshuay03 · Pull Request #51165 · rails/rails · GitHub
ActiveRecordに関する変更です
ActiveRecordにquery_constraintsというメソッドがあります
https://api.rubyonrails.org/classes/ActiveRecord/Persistence/ClassMethods.html#method-i-query_constraints
「SELECT / UPDATE / DELETEクエリのWHERE句」および「メソッド #first と #last のORDER BY句」で使用するカラムを指定できます
このメソッドに、引数を1つだけ、かつ、その引数がプライマリーキーではないカラム名の場合、エラーメッセージが不適切なものになっていたので、わかりやすいメッセージに変更されています
from: https://github.com/rails/rails/pull/51165#discussion_r1499306051
https://gyazo.com/d730bee48a763b159c76a3abe0dc4005